#include "viml/types.h"
#include "viml/value.h"

namespace viml {

// ListObject实现
ListObject::ListObject() : Object(ObjectHeader::Type::LIST), elements_(new std::vector<Value>) {}

ListObject::~ListObject() {
    // 清理由基类的unref()和cleanup()处理
    if (elements_) {
        delete static_cast<std::vector<Value>*>(elements_);
        elements_ = nullptr;
    }
}

std::vector<Value>& ListObject::get_elements() {
    return *static_cast<std::vector<Value>*>(elements_);
}

const std::vector<Value>& ListObject::get_elements() const {
    return *static_cast<const std::vector<Value>*>(elements_);
}

void ListObject::add_element(const Value& value) {
    get_elements().push_back(value);
}

Value ListObject::get(size_t index) const {
    return get_elements()[index];
}

size_t ListObject::size() const {
    return get_elements().size();
}

void ListObject::do_cleanup() {
    // 列表清理实现（如果还没有清理的话）
    if (elements_) {
        delete static_cast<std::vector<Value>*>(elements_);
        elements_ = nullptr;
    }
}

// DictObject实现
DictObject::DictObject() : Object(ObjectHeader::Type::DICT), entries_(new std::unordered_map<std::string, Value>) {}

DictObject::~DictObject() {
    // 清理由基类的unref()和cleanup()处理
    if (entries_) {
        delete static_cast<std::unordered_map<std::string, Value>*>(entries_);
        entries_ = nullptr;
    }
}

std::unordered_map<std::string, Value>& DictObject::get_entries() {
    return *static_cast<std::unordered_map<std::string, Value>*>(entries_);
}

const std::unordered_map<std::string, Value>& DictObject::get_entries() const {
    return *static_cast<const std::unordered_map<std::string, Value>*>(entries_);
}

void DictObject::set_entry(const std::string& key, const Value& value) {
    get_entries()[key] = value;
}

bool DictObject::has_entry(const std::string& key) const {
    return get_entries().find(key) != get_entries().end();
}

size_t DictObject::size() const {
    return get_entries().size();
}

void DictObject::do_cleanup() {
    // 字典清理实现（如果还没有清理的话）
    if (entries_) {
        delete static_cast<std::unordered_map<std::string, Value>*>(entries_);
        entries_ = nullptr;
    }
}

} // namespace viml